package com.loadingclass;

/**
 * @description:
 * @author: jhy
 * @time: 2021/4/24 19:11
 */


//类加载阶段的分析
public class LoadClassTest {

    public static void main(String[] args) {
        System.out.println(B.num);
        new B();
    }

}


//分析B类的加载过程
//第一阶段，加载阶段，加载B.class生成B的Class对象
//第二阶段，链接阶段，给静态变量分配内存并赋默认值 num = 0;
//第三阶段：初始化阶段,按照语句在源文件的出现顺序， 依次  自动收集类中所有静态变量的赋值动作和静态代码块中的语句
/*
    执行<clinit>(){
        System.out.println("B静态代码块被执行");
        num = 300;
        num = 100;
    }
 */
//所以第一个调用类的静态变量B.num，导致类的加载
//因为类只能被加载一次，所以当new B(),就只剩调用B的构造器
class B{

    static {
        System.out.println("B静态代码块被执行");
        num = 300;
    }

    static int num = 100;

    public B(){
        System.out.println("B的构造器执行了");
    }

}
